﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using OfficeOpenXml;
using Python.Runtime;
using 畜牧业审核程序国产.Models;

namespace 畜牧业审核程序国产.ViewModels.PythonViewModels
{
    internal class TestPythonViewModel : ObservableObject
    {
        public RelayCommand TestPythonCommand { get; private set; }
        public RelayCommand TestResourceCommand { get; private set; }
        public TestPythonViewModel()
        {
            this.TestPythonCommand = new RelayCommand(TestPython);
            //if (Runtime.PythonDLL == null)//从实际使用来看,在整个程序的生命周期中,该属性只能被初始化(赋值)一次,多次初始化就报错
            //{
            //    if (OperatingSystem.IsWindows())
            //    {
            //        //选择python的dll位置
            //        Runtime.PythonDLL = "C:\\python31011\\python310.dll";
            //        //创建python环境
            //        PythonEngine.Initialize();
            //    }
            //    else if (OperatingSystem.IsLinux() && RuntimeInformation.ProcessArchitecture == Architecture.X64)
            //    {
            //        string pythonLibPath = "/usr/lib/x86_64-linux-gnu";
            //        Runtime.PythonDLL = $"{pythonLibPath}/libpython3.12.so.1";
            //        /*string scriptPath = Path.Combine(AppContext.BaseDirectory, @"Assets");
            //        scriptPath = Path.Combine(scriptPath, "PythonSrc");
            //        scriptPath = Path.Combine(scriptPath, "linux64");
            //        Runtime.PythonDLL = Path.Combine(scriptPath, "ibpython3.12.so.1");*/
            //        PythonEngine.Initialize();

            //    }
            //}
            this.TestResourceCommand = new RelayCommand(async () => await TestResource());
        }
        public async Task TestResource()
        {
            //AppDomain.CurrentDomain.BaseDirectory：
            //适用于.NET Framework。事实证明也能用于.net8
            //返回应用程序域的基目录路径。
            //Environment.CurrentDirectory 和 System.IO.Directory.GetCurrentDirectory()：
            //返回当前工作目录的路径。
            //当前工作目录可能与应用程序的基目录不同，特别是在某些情况下（例如，通过命令行工具运行时）。
            //Assembly.GetExecutingAssembly().Location：
            //返回正在执行的代码所在的程序集的路径。
            //在某些情况下，这可能是你想要的应用程序的基目录，尤其是在类库项目中。
            //Assembly.GetEntryAssembly().Location：
            //返回入口点程序集的路径（通常是可执行文件的路径）。
            //适用于需要知道主应用程序可执行文件位置的情况。
            //AppContext.BaseDirectory：
            //适用于.NET Core 和.NET 5 +。
            //返回应用程序上下文的基本目录路径，通常是最可靠的选择之一。
            string path = AppDomain.CurrentDomain.BaseDirectory;
            await MyMessagebox.Show(path);//有\
            await MyMessagebox.Show(Environment.CurrentDirectory);//无\
            await MyMessagebox.Show(System.IO.Directory.GetCurrentDirectory());//无\
            await MyMessagebox.Show(Assembly.GetExecutingAssembly().Location);//这里返回的是dll的全部路径
            await MyMessagebox.Show(AppContext.BaseDirectory);//有\
            ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
            string path1 = Path.Combine(AppContext.BaseDirectory, "Assets");
            string path2 = Path.Combine(path1, "LedgerTemplates");
            string path3 = Path.Combine(path2, "13羊大型养殖场（户）台账.xlsx");
            using (var package = new ExcelPackage(path3))
            {
                var wb = package.Workbook;
                string msgs = wb.Worksheets[0].Cells[8,1].Value.ToString();
                await MyMessagebox.Show(msgs);
            }



        }
        public void TestPython()
        {
            ////选择python的dll位置
            //Runtime.PythonDLL = "C:\\python31011\\python310.dll";
            ////创建python环境
            //PythonEngine.Initialize();
            //展开python的全局解释器
            using (Py.GIL())
            {
                dynamic plt = Py.Import("matplotlib.pyplot");
                dynamic np = Py.Import("numpy");
                dynamic xpoints = np.array(new int[] { 0, 10 });
                dynamic ypoints = np.array(new int[] { 0, 100 });
                plt.plot(xpoints, ypoints);
                plt.show();




                //以上这段的python的代码为:
                //import matplotlib.pyplot as plt
                //import numpy as np
                //xpoints = np.array([0, 6])
                //ypoints = np.array([0, 100])
                //plt.plot(xpoints, ypoints)
                //plt.show()

                //从 Python 标准库中导入 sys 模块。sys 模块提供了对解释器使用或维护的一些变量以及与解释器强交互的函数。
                dynamic sys = Py.Import("sys");
                //将脚本路径添加到 sys.path
                string scriptPath = Path.Combine(AppContext.BaseDirectory, @"Assets");
                scriptPath = Path.Combine(scriptPath, "PythonSrc");
                sys.path.append(scriptPath);
                //sys.path 是 Python 解释器用来查找模块的路径列表。当在 Python 中导入一个模块时，
                //解释器会按照 sys.path 列表中的顺序依次搜索这些目录，直到找到目标模块或抛出 ModuleNotFoundError 异常

                //把脚本路径下自己编写的python文件导入进来,要确保该模块存在于 sys.path 列表中的某个目录中
                dynamic pie_chart_generator = Py.Import("generate_pie_chart");
                dynamic categories = new List<string> { "兰江", "云山", "永昌", "赤溪", "女埠", "上华" };
                dynamic values = new List<int> { 153, 124, 107, 99, 89, 46 };
                int sysCode = 1;
                if (OperatingSystem.IsLinux())
                {
                    sysCode = 0;
                }
                dynamic generator = pie_chart_generator.PieChartGenerator(categories, values, sysCode);
                generator.generate_pie_chart();
                //测试抛物线
                generator.showparabola();
            }
        }
    }
}
